class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        //这道题目首先使用快慢指针判断这个题目是否存在环，如果存在环那么再去寻找入环的第一个节点，否则没有寻找的必要
        //现在有环了，而通过快慢指针我们能够得到快慢指针相等的位置，让一个cur等于这个相等的位置，然后另外一个
        //cur2指针从链表的开始两个指针都一步一步的移动，两个指针相等的那个点就是入环的第一个点
        ListNode* fast = head;
        ListNode* slow = head;
        while(fast&&fast->next)
        {
            fast = fast->next->next;
            slow = slow->next;
            if(fast == slow)
            {
                //存在环
                ListNode* cur1 = fast;
                ListNode* cur2 = head;
                while(cur1!=cur2)
                {
                    cur1 = cur1->next;
                    cur2 = cur2->next;
                }
                //相遇的那个点就是入环的第一个点
                return cur1;
            }
        }
        //不存在环
        return nullptr;
    }
};